From ac5fcc6b729e03281a1639ab60189c7745360b3f Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Tue, 9 Jun 2015 23:29:47 -0400 Subject: [PATCH] text view: Select word on double tap This is an initial attempt at implementing double-tap selection. --- gtk/gtktextview.c | 44 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c index edf47bfe9e..2badc835b4 100644 --- a/gtk/gtktextview.c +++ b/gtk/gtktextview.c @@ -217,6 +217,7 @@ struct _GtkTextViewPrivate gint left_margin; gint right_margin; gint indent; + gint64 handle_place_time; PangoTabArray *tabs; guint editable : 1; @@ -572,6 +573,12 @@ static gboolean gtk_text_view_extend_selection (GtkTextView *text_vie const GtkTextIter *location, GtkTextIter *start, GtkTextIter *end); +static void extend_selection (GtkTextView *text_view, + SelectionGranularity granularity, + const GtkTextIter *location, + GtkTextIter *start, + GtkTextIter *end); + /* FIXME probably need the focus methods. */ @@ -4888,12 +4895,33 @@ gtk_text_view_handle_drag_finished (GtkTextHandle *handle, GtkTextHandlePosition pos, GtkTextView *text_view) { - if (!text_view->priv->cursor_handle_dragged && - !text_view->priv->selection_handle_dragged) - gtk_text_view_selection_bubble_popup_set (text_view); + GtkTextViewPrivate *priv = text_view->priv; + + if (!priv->cursor_handle_dragged && !priv->selection_handle_dragged) + { + GtkTextBuffer *buffer; + GtkTextIter cursor, start, end; + GtkSettings *settings; + guint double_click_time; + + settings = gtk_widget_get_settings (GTK_WIDGET (text_view)); + g_object_get (settings, "gtk-double-click-time", &double_click_time, NULL); + if (g_get_monotonic_time() - priv->handle_place_time < double_click_time * 1000) + { + buffer = get_buffer (text_view); + gtk_text_buffer_get_iter_at_mark (buffer, &cursor, + gtk_text_buffer_get_insert (buffer)); + extend_selection (text_view, SELECT_WORDS, &cursor, &start, &end); + gtk_text_buffer_select_range (buffer, &start, &end); + + gtk_text_view_update_handles (text_view, GTK_TEXT_HANDLE_MODE_SELECTION); + } + else + gtk_text_view_selection_bubble_popup_set (text_view); + } - if (text_view->priv->magnifier_popover) - gtk_widget_hide (text_view->priv->magnifier_popover); + if (priv->magnifier_popover) + gtk_widget_hide (priv->magnifier_popover); } static void @@ -5236,6 +5264,7 @@ gtk_text_view_multipress_gesture_pressed (GtkGestureMultiPress *gesture, if (is_touchscreen) handle_mode = GTK_TEXT_HANDLE_MODE_CURSOR; + get_iter_from_gesture (text_view, priv->multipress_gesture, &iter, NULL, NULL); @@ -5268,7 +5297,10 @@ gtk_text_view_multipress_gesture_pressed (GtkGestureMultiPress *gesture, gtk_text_view_selection_bubble_popup_unset (text_view); if (is_touchscreen) - gtk_text_buffer_place_cursor (get_buffer (text_view), &iter); + { + gtk_text_buffer_place_cursor (get_buffer (text_view), &iter); + priv->handle_place_time = g_get_monotonic_time (); + } else gtk_text_view_start_selection_drag (text_view, &iter, SELECT_CHARACTERS, extends); -- 2.30.2